Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 1afc9fd2a97f38365f657f57b1d69ef7afddd323


Parents : 7cc777f
Author : Mark Qvist <mark@unsigned.io>
Date : 2022-01-14T21:12:33+01:00

Improved ESP32 compatibility

Changes

2 files changed, 104 insertions(+), 133 deletions(-)

M Config.h +1 -1
M RNode_Firmware.ino +103 -132

Diff

diff --git a/Config.h b/Config.h
index c09d961..c58f42b 100644
--- a/Config.h
+++ b/Config.h
@@ -83,7 +83,7 @@
#define BOARD_MODEL BOARD_TBEAM
- #define CONFIG_UART_BUFFER_SIZE 64
+ #define CONFIG_UART_BUFFER_SIZE 6144
#define CONFIG_QUEUE_SIZE 6144
#define CONFIG_QUEUE_MAX_LENGTH 250

diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino
index 5fa3802..8bebf9e 100644
--- a/RNode_Firmware.ino
+++ b/RNode_Firmware.ino
@@ -22,18 +22,13 @@ volatile bool serial_buffering = false;
char sbuf[128];
#if MCU_VARIANT == MCU_ESP32
- #include "soc/rtc_wdt.h"
- #define ISR_VECT IRAM_ATTR
bool packet_ready = false;
-#else
- #define ISR_VECT
#endif
void setup() {
#if MCU_VARIANT == MCU_ESP32
delay(500);
EEPROM.begin(EEPROM_SIZE);
- // TODO: Check this
Serial.setRxBufferSize(CONFIG_UART_BUFFER_SIZE);
#endif
@@ -69,16 +64,9 @@ void setup() {
// pins for the LoRa module
LoRa.setPins(pin_cs, pin_reset, pin_dio);
- #if MCU_VARIANT == MCU_ESP32
- // ESP32-specific initialisation
- Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, PIN_GPS_RX, PIN_GPS_TX);
-
- // rtc_wdt_protect_off();
- // rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM);
- // rtc_wdt_set_time(RTC_WDT_STAGE0, 25);
- // rtc_wdt_protect_on();
- // rtc_wdt_enable();
-
+ #if MCU_VARIANT == MCU_ESP32
+ Wire.begin(I2C_SDA, I2C_SCL);
+ initPMU();
kiss_indicate_reset();
#endif
@@ -97,7 +85,7 @@ void lora_receive() {
inline void kiss_write_packet() {
Serial.write(FEND);
Serial.write(CMD_DATA);
- for (int i = 0; i < read_len; i++) {
+ for (uint16_t i = 0; i < read_len; i++) {
uint8_t byte = pbuf[i];
if (byte == FEND) { Serial.write(FESC); byte = TFEND; }
if (byte == FESC) { Serial.write(FESC); byte = TFESC; }
@@ -110,123 +98,89 @@ inline void kiss_write_packet() {
#endif
}
-inline void getPacketData(int len) {
+inline void getPacketData(uint16_t len) {
while (len-- && read_len < MTU) {
pbuf[read_len++] = LoRa.read();
}
}
-#if MCU_VARIANT == MCU_ESP32
- portMUX_TYPE isr_lock = portMUX_INITIALIZER_UNLOCKED;
-#endif
-
-bool handling_packet = false;
void ISR_VECT receive_callback(int packet_size) {
- #if MCU_VARIANT == MCU_ESP32
- portENTER_CRITICAL_ISR(&isr_lock);
- #endif
+ if (!promisc) {
+ // The standard operating mode allows large
+ // packets with a payload up to 500 bytes,
+ // by combining two raw LoRa packets.
+ // We read the 1-byte header and extract
+ // packet sequence number and split flags
+ uint8_t header = LoRa.read(); packet_size--;
+ uint8_t sequence = packetSequence(header);
+ bool ready = false;
+
+ if (isSplitPacket(header) && seq == SEQ_UNSET) {
+ // This is the first part of a split
+ // packet, so we set the seq variable
+ // and add the data to the buffer
+ read_len = 0;
+ seq = sequence;
- #if MCU_VARIANT == MCU_ESP32
- if (!handling_packet) {
- handling_packet = true;
- #endif
-
- if (!promisc) {
- // The standard operating mode allows large
- // packets with a payload up to 500 bytes,
- // by combining two raw LoRa packets.
- // We read the 1-byte header and extract
- // packet sequence number and split flags
- uint8_t header = LoRa.read(); packet_size--;
- uint8_t sequence = packetSequence(header);
- bool ready = false;
-
- if (isSplitPacket(header) && seq == SEQ_UNSET) {
- // This is the first part of a split
- // packet, so we set the seq variable
- // and add the data to the buffer
- read_len = 0;
- seq = sequence;
-
- #if MCU_VARIANT != MCU_ESP32
- last_rssi = LoRa.packetRssi();
- last_snr_raw = LoRa.packetSnrRaw();
- #endif
-
- getPacketData(packet_size);
-
- } else if (isSplitPacket(header) && seq == sequence) {
- // This is the second part of a split
- // packet, so we add it to the buffer
- // and set the ready flag.
-
- #if MCU_VARIANT != MCU_ESP32
- last_rssi = (last_rssi+LoRa.packetRssi())/2;
- last_snr_raw = (last_snr_raw+LoRa.packetSnrRaw())/2;
- #endif
-
- getPacketData(packet_size);
- seq = SEQ_UNSET;
- ready = true;
-
- } else if (isSplitPacket(header) && seq != sequence) {
- // This split packet does not carry the
- // same sequence id, so we must assume
- // that we are seeing the first part of
- // a new split packet.
- read_len = 0;
- seq = sequence;
+ #if MCU_VARIANT != MCU_ESP32
+ last_rssi = LoRa.packetRssi();
+ last_snr_raw = LoRa.packetSnrRaw();
+ #endif
- #if MCU_VARIANT != MCU_ESP32
- last_rssi = LoRa.packetRssi();
- last_snr_raw = LoRa.packetSnrRaw();
- #endif
+ getPacketData(packet_size);
- getPacketData(packet_size);
+ } else if (isSplitPacket(header) && seq == sequence) {
+ // This is the second part of a split
+ // packet, so we add it to the buffer
+ // and set the ready flag.
+
+ #if MCU_VARIANT != MCU_ESP32
+ last_rssi = (last_rssi+LoRa.packetRssi())/2;
+ last_snr_raw = (last_snr_raw+LoRa.packetSnrRaw())/2;
+ #endif
+
+ getPacketData(packet_size);
+ seq = SEQ_UNSET;
+ ready = true;
+
+ } else if (isSplitPacket(header) && seq != sequence) {
+ // This split packet does not carry the
+ // same sequence id, so we must assume
+ // that we are seeing the first part of
+ // a new split packet.
+ read_len = 0;
+ seq = sequence;
- } else if (!isSplitPacket(header)) {
- // This is not a split packet, so we
- // just read it and set the ready
- // flag to true.
+ #if MCU_VARIANT != MCU_ESP32
+ last_rssi = LoRa.packetRssi();
+ last_snr_raw = LoRa.packetSnrRaw();
+ #endif
- if (seq != SEQ_UNSET) {
- // If we already had part of a split
- // packet in the buffer, we clear it.
- read_len = 0;
- seq = SEQ_UNSET;
- }
+ getPacketData(packet_size);
- #if MCU_VARIANT != MCU_ESP32
- last_rssi = LoRa.packetRssi();
- last_snr_raw = LoRa.packetSnrRaw();
- #endif
+ } else if (!isSplitPacket(header)) {
+ // This is not a split packet, so we
+ // just read it and set the ready
+ // flag to true.
- getPacketData(packet_size);
- ready = true;
+ if (seq != SEQ_UNSET) {
+ // If we already had part of a split
+ // packet in the buffer, we clear it.
+ read_len = 0;
+ seq = SEQ_UNSET;
}
- if (ready) {
- #if MCU_VARIANT != MCU_ESP32
- // We first signal the RSSI of the
- // recieved packet to the host.
- kiss_indicate_stat_rssi();
- kiss_indicate_stat_snr();
-
- // And then write the entire packet
- kiss_write_packet();
- #else
- packet_ready = true;
- #endif
- }
- } else {
#if MCU_VARIANT != MCU_ESP32
- // In promiscuous mode, raw packets are
- // output directly to the host
- read_len = 0;
last_rssi = LoRa.packetRssi();
last_snr_raw = LoRa.packetSnrRaw();
- getPacketData(packet_size);
+ #endif
+
+ getPacketData(packet_size);
+ ready = true;
+ }
+ if (ready) {
+ #if MCU_VARIANT != MCU_ESP32
// We first signal the RSSI of the
// recieved packet to the host.
kiss_indicate_stat_rssi();
@@ -234,21 +188,33 @@ void ISR_VECT receive_callback(int packet_size) {
// And then write the entire packet
kiss_write_packet();
-
#else
- read_len = 0;
- getPacketData(packet_size);
packet_ready = true;
#endif
- #if MCU_VARIANT == MCU_ESP32
- }
- handling_packet = false;
+ }
+ } else {
+ #if MCU_VARIANT != MCU_ESP32
+ // In promiscuous mode, raw packets are
+ // output directly to the host
+ read_len = 0;
+ last_rssi = LoRa.packetRssi();
+ last_snr_raw = LoRa.packetSnrRaw();
+ getPacketData(packet_size);
+
+ // We first signal the RSSI of the
+ // recieved packet to the host.
+ kiss_indicate_stat_rssi();
+ kiss_indicate_stat_snr();
+
+ // And then write the entire packet
+ kiss_write_packet();
+
+ #else
+ read_len = 0;
+ getPacketData(packet_size);
+ packet_ready = true;
#endif
}
-
- #if MCU_VARIANT == MCU_ESP32
- portEXIT_CRITICAL_ISR(&isr_lock);
- #endif
}
@@ -628,9 +594,22 @@ void serialCallback(uint8_t sbyte) {
}
}
+#if MCU_VARIANT == MCU_ESP32
+ portMUX_TYPE update_lock = portMUX_INITIALIZER_UNLOCKED;
+#endif
+
void updateModemStatus() {
+ #if MCU_VARIANT == MCU_ESP32
+ portENTER_CRITICAL(&update_lock);
+ #endif
+
uint8_t status = LoRa.modemStatus();
last_status_update = millis();
+
+ #if MCU_VARIANT == MCU_ESP32
+ portEXIT_CRITICAL(&update_lock);
+ #endif
+
if (status & SIG_DETECT == SIG_DETECT) { stat_signal_detected = true; } else { stat_signal_detected = false; }
if (status & SIG_SYNCED == SIG_SYNCED) { stat_signal_synced = true; } else { stat_signal_synced = false; }
if (status & RX_ONGOING == RX_ONGOING) { stat_rx_ongoing = true; } else { stat_rx_ongoing = false; }
@@ -801,14 +780,6 @@ void buffer_serial() {
#endif
}
- #if MCU_VARIANT == MCU_ESP32
- // Discard GPS data for now
- c = 0;
- while (c < MAX_CYCLES && Serial1.available()) {
- Serial1.read();
- }
- #endif
-
serial_buffering = false;
}
}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────